#ifndef _W25QXX_H
#define _W25QXX_H

#define _W25QXX


#ifdef _W25QXX

#include <stdint.h>

#define W25Q80 	0XEF13 	
#define W25Q16 	0XEF14
#define W25Q32 	0XEF15
#define W25Q64 	0XEF16
#define W25Q128	0XEF17
#define W25Q256 0XEF18	   
#define W25Q512 0XEF19	

#define W25X_WriteEnable		0x06 
#define W25X_WriteDisable		0x04 
#define W25X_ReadStatusReg1		0x05 
#define W25X_ReadStatusReg2		0x35 
#define W25X_ReadStatusReg3		0x15 
#define W25X_WriteStatusReg1    0x01 
#define W25X_WriteStatusReg2    0x31 
#define W25X_WriteStatusReg3    0x11 
#define W25X_ReadData			0x03 
#define W25X_FastReadData		0x0B 
#define W25X_FastReadDual		0x3B 
#define W25X_PageProgram		0x02 
#define W25X_BlockErase			0xD8 
#define W25X_SectorErase		0x20 
#define W25X_ChipErase			0xC7 
#define W25X_PowerDown			0xB9 
#define W25X_ReleasePowerDown	0xAB 
#define W25X_DeviceID			0xAB 
#define W25X_ManufactDeviceID	0x90 
#define W25X_JedecDeviceID		0x9F 
#define W25X_Enable4ByteAddr    0xB7
#define W25X_Exit4ByteAddr      0xE9

struct w25qxxOps{
    void (*w25qxxSpiInit)(void);
    uint8_t (*w25qxxReadWrite)(uint8_t);
    void (*w25qxxEnable)(void);
    void (*w25qxxDisable)(void);
    uint16_t w25qxxType;
};
typedef struct w25qxxOps w25qxxOps_t;

#ifdef __cplusplus
extern "C"{
#endif
extern void w25qxxInit(void);
extern void w25qxxWakeup(void);
extern void w25qxxPowerDown(void);
extern void w25qxxWrite(uint8_t *pBuffer,uint32_t writeAddr,uint16_t numByteToWrite);
extern void w25qxxEraseChip(void);
extern void w25qxxEraseSector(uint32_t dstAddr);
extern void w25qxxRead(uint8_t *pBuffer,uint32_t readAddr,uint16_t numByteToRead);
extern void w25qxxWriteDisable(void);
extern uint16_t w25qxxReadId(void);
#ifdef __cplusplus
}
#endif

#endif

#endif
